/***********************************************************************************
 * 文件名： smcp.h
 * 作者： 刘言
 * 版本： 4.1
 * 说明：
 * 		Smart Mist Communication Protocol (SMCP) 4.1 通信协议（网络层）的实现。
 *      单缓存覆盖机制：发送方每次发送数据都会复写缓存，所以发送方必须确保接收方已经处理了上
 *  一包数据才能发送下一包数据。
 * 修改记录：
 * 	2021/2/1: 初版。 刘言。
 *  2021/4/12: 增加加密通信功能。 刘言
 *  2021/4/14: 增加主机功能，主从可任意切换。
 *  2024/3/12: 支持4.1。刘言。
***********************************************************************************/

#include "smcp_common.h"  
#include "smcp_link.h"

// APIs

/**
 * 初始化.内部包括了硬件端口驱动的初始化（依据配置文件）
*/
void Smcp_Init();

void Smcp_SetCb(smcp_callback_t cb);

#if (SMCP_ROLE == 2)
// 设置本机角色
// role: SMCP_ROLE_SLAVE-从机，SMCP_ROLE_HOST-主机
void Smcp_SetRole(smcp_role_t role);
#endif

#if (SMCP_ROLE != 1) // 以下为主机专用函数

// 设置目标设备（从机类型、ID）
void Smcp_SetTargetDevice(u8 device_type);

// 主机发送 HANDSHAKE
// 收到从机返回的HANDSHAKE后内部会处理 认证码计算、从机数据包长度
void Smcp_HandShake();

// 设置是否加密，如有必要，在发送命令前设置。
// 只有当本机处于主机角色时才有效，注意不要在等待从机回应时进行切换。
void Smcp_SetEcrypt(bool new_state);

// 发送READ命令
void Smcp_Read(u32 addr, u16 length);

// 发送 WRITE 命令
// length： 数据字节数，不能超过 _SMCP_MAX_TX_DATA_LEN 或者 从机报告的数据包最大长度-16，否则无效。
// 返回值：WRITE命令是否已发送，当参数不合法时返回false。
// 通过获取从机的回应数据包来确定写入是否成功。
bool Smcp_Write(u32 addr, u8 *dat, u16 length);

// 升级从机固件，此命令发出后从机固件会被擦除，并运行OkBoot。
void Smcp_Update();

#endif

#if (SMCP_ROLE != 0) // 以下为从机专用函数

// 发送RETURN数据包
// e - 结果
// dat - 数据地址，无数据时为NULL
// length - 数据长度，无数据时为0
void Smcp_Return(smcp_rt_t e, const u8 *dat, u16 length);

#endif

// 获取接收到的数据（实际上仅获取了缓存地址）
STATIC_FORCE_IN_LINE const u8 *Smcp_GetReceiveData()
{
    return SmcpLink_GetReceiveData();
}

// 获取接收到的数据包长度
STATIC_FORCE_IN_LINE u16 Smcp_GetLength()
{
    return SmcpLink_GetLength();
}

// 获取当前或者最后一次接收到数据的端口号
STATIC_FORCE_IN_LINE u8 Smcp_GetPortNum()
{
    return SmcpLink_GetPortNum();
}

// 清空接收缓存（仅在缓存满了时需要清空，便于继续接收余下的数据，接收一包完整数据后缓存会被自动处理）
STATIC_FORCE_IN_LINE void Smcp_ClearBuff()
{
    SmcpLink_ClearBuff();
}

